import { Component } from '../Component';
import { registryComponent } from '../Registry';

export function apclassFun<T extends { new (...args: any[]): Component }>(
  /**
   * 要注册的组件的名称。
   * 如果未提供名称，则使用构造函数的名称。
   */
  name?: string
) {
  return function (target: T) {
    // 检查传入的构造函数是否是Component类的子类
    if (!Component.prototype.isPrototypeOf(target.prototype)) {
      throw new TypeError(
        `装饰器@apclass只能用于Component的子类，但${target.name}不是Component的子类`
      );
    }

    // @ts-expect-error
    target.__apclass__ = true;

    // 使用传入的名称或构造函数名称作为组件名
    const componentName = name || target.name;

    // 将构造函数与其名称一起注册到全局的registryComponent中
    registryComponent.set(componentName, target);
  };
}
